home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / amiexpress / source / oldheads.lzh / amiconsasc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-04  |  14.7 KB  |  644 lines

  1. #include <exec/exec.h>
  2. #include <dos/dos.h>
  3. #include <libraries/dos.h>
  4. #include <devices/timer.h>
  5. #include <intuition/intuitionbase.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include "work:romconf/doorheader.h"
  9. #include <proto/exec.h>
  10. #include <proto/dos.h>
  11. #include <string.h>
  12. //#include <functions.h>
  13. #define FOREVER for(;;)
  14. #define SM sendmessage
  15. #define HK hotkey
  16. #define FHK Fhotkey
  17. #define PM prompt
  18. #define LI lineinput
  19. #define JH_CK 500
  20. #define JH_ExtHK 15
  21.  
  22.  
  23. #define ADDBIT 1000
  24. #define REMBIT 1001
  25. #define QUERYBIT 1002
  26.  
  27. extern VOID Register(int node);
  28. extern VOID ShutDown(VOID);
  29. VOID ClosePort(void);
  30. extern int Editfile(char Name[],int len);
  31. extern void sendmessage(char mstring[],int nl);
  32. extern void mciputstr(char mstring[],int nl);
  33. extern int Download(char *s);
  34. extern int Upload(char *s);
  35. extern void ConOnly(char mstring[],int nl);
  36. extern void SerOnly(char mstring[],int nl);
  37. extern void sendMessage(char mstring[],int nl);
  38. void MciSendStr(char mstring[],int nl);
  39. extern int GetInfo(int cmd);
  40. extern void PutInfo(int data,int cmd);
  41. extern void sendchar(char mstring[], int nl);
  42. extern void hotkey(char mstring[],char *ostring);
  43. extern int FetchKey(void);
  44. extern int sigkey(void);
  45. extern char Fhotkey(void);
  46. extern int getkey(void);
  47. extern void Chain(char *str,int node,int opt);
  48. extern void prompt(char mstring[],char *ostring,int len);
  49. extern void lineinput(char mstring[],char *ostring,int len);
  50. extern void showfile(char mstring[]);
  51. extern void showgfile(char mstring[]);
  52. extern void getuserstring(char *ostring,int nl);
  53. extern void putuserstring(char *ostring,int nl);
  54. extern int getsignal(void);
  55. extern void FlagFile(char *string);
  56. extern void CloseOut(void);
  57. extern BOOL CheckToDisplay(char *s);
  58. extern int TLock(char *str);
  59. extern APTR GetSemaphore(void);
  60. extern int AcsStat(int bits,int opt);
  61. extern void end(void);
  62. extern void LastCommand(void);
  63. extern STRPTR GetTheDate(long number);
  64. extern STRPTR GetTheTime(long number);
  65. extern void getspecdata(char *ostring,char *dest,int nl);
  66.  
  67. void getsystime(long number,char *d,char *t);
  68.  
  69. struct MsgPort *port;
  70. struct MsgPort *replymp;
  71. struct JHMessage *Jhmsg,*msg;
  72. #define ANYKEY "press <RETURN> to continue"
  73. char DoorReply[] = "AEDoorRP.000";
  74. extern APTR GetSemaphore(void);
  75. VOID Register(int node)
  76. {
  77.   ULONG portsig;
  78.   int n1,n2,n3;
  79.   int found=0;
  80.   char PortName[80];
  81.   Jhmsg=(struct JHMessage *)AllocMem(sizeof(struct JHMessage),MEMF_PUBLIC);
  82.  
  83.  if(Jhmsg==0)
  84.   {
  85.      printf("Not enough Memory for message structure\n");
  86.      exit(30);
  87.   }
  88.   n1=n2=n3=0;
  89.   while(n1<10)
  90.   {
  91.     n2=0;
  92.     while(n2<10)
  93.     {
  94.       n3=0;
  95.       while(n3<10)
  96.       {
  97.         DoorReply[9]=n1+'0';
  98.         DoorReply[10]=n2+'0';
  99.         DoorReply[11]=n3+'0';
  100.         if(FindPort(DoorReply)) { n3++; continue; }
  101.         found=1; break;
  102.       }
  103.       if(found) break;
  104.       n2++;
  105.     }
  106.     if(found) break;
  107.     n1++;
  108.   }
  109.   if(!found)
  110.   {
  111.      FreeMem(Jhmsg,sizeof(struct JHMessage));
  112.     exit(30);
  113.   }
  114.   replymp=CreatePort(DoorReply,0L); strcpy(PortName,DoorReply);
  115.   
  116.  
  117.   if(replymp==0)
  118.   {
  119.     printf("Couldn't create reply port\n");
  120.     FreeMem(Jhmsg,sizeof(struct JHMessage));
  121.     exit(30);
  122.   }
  123.   Jhmsg->Msg.mn_Node.ln_Type=NT_MESSAGE;
  124.   Jhmsg->Msg.mn_Length=sizeof(struct JHMessage);
  125.   Jhmsg->Msg.mn_ReplyPort=replymp;
  126.   strcpy(Jhmsg->String,PortName);
  127.   Jhmsg->Command=JH_REGISTER;
  128.   Jhmsg->Data=2;
  129.   Jhmsg->NodeID=-1;
  130.   Jhmsg->LineNum=0;
  131.   sprintf(PortName,"AEDoorPort%d",node);
  132.   while(!(port=FindPort(PortName)));
  133.   PutMsg(port,(struct Message *)Jhmsg);
  134.  
  135.     portsig=1<<replymp->mp_SigBit;
  136.   
  137. Wait(portsig);
  138. msg=(struct JHMessage *)GetMsg((struct MsgPort *)replymp);
  139. }
  140.  
  141. VOID ShutDown(VOID)
  142. {
  143.  ULONG portsig,signal;
  144.   LastCommand();
  145.  portsig=1<<replymp->mp_SigBit;
  146.   Jhmsg->Command=JH_SHUTDOWN;
  147.   PutMsg(port,(struct Message *)Jhmsg); 
  148.   signal=Wait(portsig);
  149.   ClosePort();
  150. }
  151.  
  152. void ClosePort(void)
  153. {
  154.       while(msg=(struct JHMessage *)GetMsg((struct MsgPort *)replymp));
  155.        DeletePort((struct MsgPort *)replymp);
  156.        FreeMem(Jhmsg,sizeof(struct JHMessage));
  157. }
  158. int Editfile(char Name[],int len)
  159.          strcpy(msg->String,Name);
  160.          msg->Command=JH_EF;
  161.          msg->Data=len;
  162.          PutMsg(port,(struct Message *)Jhmsg); 
  163.          WaitPort(replymp);
  164.          GetMsg(replymp);
  165.          len=msg->Data;
  166.          if(msg->Data==-1) CloseOut();
  167.          return(len);
  168. }
  169.  
  170.  
  171. void sendmessage(char mstring[],int nl)
  172. {
  173.         register int counter;
  174.         char Temp[80];
  175.    
  176.         if(strlen(mstring)<80) sendMessage(mstring,0);
  177.         else
  178.         {
  179.           counter=0;
  180.           do
  181.           {
  182.             sprintf(Temp,"%.79s",&mstring[counter]);
  183.             sendMessage(Temp,0);
  184.             counter +=79;
  185.           }while(strlen(Temp)==79);
  186.         }
  187.         if(nl==1){ sendMessage("",1); Jhmsg->LineNum +=1; }
  188.         if(Jhmsg->LineNum==22)
  189.         { hotkey(ANYKEY,Temp); 
  190.  SM("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b",0);
  191. SM("                          ",0);
  192. SM("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b",0);
  193. }
  194. }
  195. void mciputstr(char mstring[],int nl)
  196. {
  197.         register int counter;
  198.         char Temp[80];
  199.    
  200.         if(strlen(mstring)<80) MciSendStr(mstring,0);
  201.         else
  202.         {
  203.           counter=0;
  204.           do
  205.           {
  206.             sprintf(Temp,"%.79s",&mstring[counter]);
  207.             MciSendStr(Temp,0);
  208.             counter +=79;
  209.           }while(strlen(Temp)==79);
  210.         }
  211.         if(nl==1) MciSendStr("",1); 
  212. }
  213. int Download(char *s)
  214. {
  215.    strcpy(Jhmsg->String,s);
  216.    Jhmsg->Command=ZMODEMSEND;
  217.    PutMsg(port,(struct Message *)Jhmsg);
  218.    WaitPort(replymp);
  219.    GetMsg(replymp);
  220.    if(Jhmsg->Data==0) return(0);
  221.    if(Jhmsg->Data==1) return(1);
  222.    if(Jhmsg->Data==-2)
  223.    {
  224.      CloseOut();
  225.    }
  226. }
  227. int Upload(char *s)
  228. {
  229.    strcpy(Jhmsg->String,s);
  230.    Jhmsg->Command=ZMODEMRECEIVE;
  231.    PutMsg(port,(struct Message *)Jhmsg);
  232.    WaitPort(replymp);
  233.    GetMsg(replymp);
  234.    if(Jhmsg->Data==0) return(0);
  235.    if(Jhmsg->Data==1) return(1);
  236.    if(Jhmsg->Data==-2)
  237.    {
  238.      CloseOut();
  239.    }
  240. }
  241. void ConOnly(char mstring[],int nl)
  242. {
  243.   Jhmsg->Data = nl;
  244.   Jhmsg->Command = JH_CO;
  245.   strcpy(Jhmsg->String,mstring);
  246.   PutMsg(port,(struct Message *)Jhmsg);
  247.   (void)WaitPort(replymp);
  248.   (void)GetMsg(replymp);
  249. }
  250. void SerOnly(char mstring[],int nl)
  251. {
  252.   Jhmsg->Data = nl;
  253.   Jhmsg->Command = JH_SO;
  254.   strcpy(Jhmsg->String,mstring);
  255.   PutMsg(port,(struct Message *)Jhmsg);
  256.   (void)WaitPort(replymp);
  257.   (void)GetMsg(replymp);
  258. }
  259. void sendMessage(char mstring[],int nl)
  260. {
  261.     Jhmsg->Data = nl;
  262.     Jhmsg->Command = JH_SM;
  263.     strcpy(Jhmsg->String,mstring);
  264.     PutMsg(port,(struct Message *)Jhmsg);
  265.     (void)WaitPort(replymp);
  266.     (void)GetMsg(replymp);
  267. }
  268. void MciSendStr(char mstring[],int nl)
  269. {
  270.     Jhmsg->Data = nl;
  271.     Jhmsg->Command = JH_MCI;
  272.     strcpy(Jhmsg->String,mstring);
  273.     PutMsg(port,(struct Message *)Jhmsg);
  274.     (void)WaitPort(replymp);
  275.     (void)GetMsg(replymp);
  276. }
  277.  
  278. int GetInfo(int cmd)
  279. {
  280.    Jhmsg->Command=cmd;
  281.    PutMsg(port,(struct Message *)Jhmsg);
  282.    WaitPort(replymp);
  283.    GetMsg(replymp);
  284.    return(msg->Data);
  285. }
  286. void PutInfo(int data,int cmd)
  287. {
  288.    Jhmsg->Command=cmd;
  289.    Jhmsg->Data=data;
  290.    PutMsg(port,(struct Message *)Jhmsg);
  291.    WaitPort(replymp);
  292.    GetMsg(replymp);
  293. }
  294. void sendchar(char mstring[],int nl)
  295. {
  296.      char temp[3];
  297.      temp[0]=mstring[0];
  298.      temp[1]='\0';
  299.     Jhmsg->Data = nl;
  300.     Jhmsg->Command = JH_SM;
  301.      strcpy(Jhmsg->String,temp);
  302.     PutMsg(port,(struct Message *)Jhmsg);
  303.     (void)WaitPort(replymp);
  304.     (void)GetMsg(replymp);
  305. }
  306. void hotkey(char mstring[],char *ostring)
  307. {
  308.         Jhmsg->LineNum=0;
  309.     strcpy(Jhmsg->String,mstring);
  310.     Jhmsg->Command = JH_HK;
  311.     PutMsg(port,(struct Message *)Jhmsg);
  312.     (void)WaitPort(replymp);
  313.     (void)GetMsg(replymp);
  314.     strcpy(ostring,Jhmsg->String);
  315. if(Jhmsg->Data==-1) CloseOut();
  316. }
  317. int FetchKey(void)
  318. {
  319.         Jhmsg->LineNum=0;
  320.     Jhmsg->Command = JH_FETCHKEY;
  321.     PutMsg(port,(struct Message *)Jhmsg);
  322.     (void)WaitPort(replymp);
  323.     (void)GetMsg(replymp);
  324. if(Jhmsg->Data==-1) CloseOut();
  325.  return(Jhmsg->Command);
  326. }
  327. int sigkey(void)
  328. {
  329.     Jhmsg->Command = JH_ExtHK;
  330.     PutMsg(port,(struct Message *)Jhmsg);
  331.     (void)WaitPort(replymp);
  332.     (void)GetMsg(replymp);
  333.  
  334. if(Jhmsg->Data==-1) CloseOut();
  335.      return(Jhmsg->Command);
  336. }
  337. char Fhotkey(void)
  338. {
  339.         Jhmsg->LineNum=0;
  340.     Jhmsg->Command = JH_HK;
  341.     PutMsg(port,(struct Message *)Jhmsg);
  342.     (void)WaitPort(replymp);
  343.     (void)GetMsg(replymp);
  344.     
  345. if(Jhmsg->Data==-1) CloseOut();
  346.     return(*(Jhmsg->String));
  347. }
  348. int getkey(void)
  349. {
  350.         Jhmsg->LineNum=0;
  351.     Jhmsg->Command = JH_CK;
  352.     PutMsg(port,(struct Message *)Jhmsg);
  353.     (void)WaitPort(replymp);
  354.     (void)GetMsg(replymp);
  355.     if(Jhmsg->String[0]=='1') return(1); else return(0);
  356. }
  357.  
  358. void Chain(char *str,int node,int opt)
  359. {
  360.   char cmd[200];
  361.   if(opt==SHUTDOWN)
  362.   {
  363.     sprintf(cmd,"RUN >NIL: %s %d",str,node);
  364.     Jhmsg->Command=CHAIN;
  365.     PutMsg(port,(struct Message *)Jhmsg);
  366.     (void)WaitPort(replymp);
  367.     (void)GetMsg(replymp);
  368.     ClosePort();
  369.     Execute(cmd,NULL,NULL);
  370.     
  371.   }
  372.   if(opt==WAIT)
  373.   {
  374.     sprintf(cmd,"%s %d",str,node);
  375.     //Jhmsg->Command=CHAIN;
  376.     //PutToPort((struct Message *)Jhmsg);
  377.     //(void)WaitPort(replymp);
  378.     //(void)GetMsg(replymp);
  379.     //ClosePort();
  380.     Execute(cmd,NULL,NULL);
  381.     //Register(node);
  382.     return;
  383.   }
  384. }
  385.  
  386. void prompt(char mstring[],char *ostring,int len)
  387. {
  388.         len +=1;
  389.         Jhmsg->LineNum=0;
  390.     strcpy(Jhmsg->String,mstring);
  391.     Jhmsg->Data=len;
  392.     Jhmsg->Command = JH_PM;
  393.     PutMsg(port,(struct Message *)Jhmsg);
  394.     (void)WaitPort(replymp);
  395.     (void)GetMsg(replymp);
  396.     strcpy(ostring,Jhmsg->String);
  397. if(Jhmsg->Data==-1) CloseOut();
  398. }
  399. void lineinput(char mstring[],char *ostring,int len)
  400. {
  401.         len +=1;
  402.         Jhmsg->LineNum=0;
  403.     strcpy(Jhmsg->String,mstring);
  404.     Jhmsg->Data=len;
  405.     Jhmsg->Command = JH_LI;
  406.     PutMsg(port,(struct Message *)Jhmsg);
  407.     (void)WaitPort(replymp);
  408.     (void)GetMsg(replymp);
  409.     strcpy(ostring,Jhmsg->String);
  410. if(Jhmsg->Data==-1) CloseOut();
  411. }
  412. void showfile(char mstring[])
  413. {
  414.     strcpy(Jhmsg->String,mstring);
  415.     Jhmsg->Command = JH_SF;
  416.     PutMsg(port,(struct Message *)Jhmsg);
  417.     (void)WaitPort(replymp);
  418.     (void)GetMsg(replymp);
  419. }
  420. void showgfile(char mstring[])
  421. {
  422.     strcpy(Jhmsg->String,mstring);
  423.     Jhmsg->Command = JH_SG;
  424.     PutMsg(port,(struct Message *)Jhmsg);
  425.     (void)WaitPort(replymp);
  426.     (void)GetMsg(replymp);
  427. }
  428.  
  429. void getuserstring(char *ostring,int nl)
  430. {
  431.         Jhmsg->Command = nl;
  432.         Jhmsg->Data=READIT;
  433.     PutMsg(port,(struct Message *)Jhmsg);
  434.     (void)WaitPort(replymp);
  435.     (void)GetMsg(replymp);
  436.    strcpy(ostring,Jhmsg->String);
  437. }
  438. void putuserstring(char *ostring,int nl)
  439. {
  440.         Jhmsg->Command = nl;
  441.         Jhmsg->Data=WRITEIT;
  442.         strcpy(Jhmsg->String,ostring);
  443.     PutMsg(port,(struct Message *)Jhmsg);
  444.     (void)WaitPort(replymp);
  445.     (void)GetMsg(replymp);
  446.  
  447. }
  448. void getspecdata(char *ostring,char *dest,int nl);
  449. void getspecdata(char *ostring,char *dest,int nl)
  450. {
  451.         Jhmsg->Command = nl;
  452.         Jhmsg->Data=WRITEIT;
  453.         strcpy(Jhmsg->String,ostring);
  454.     PutMsg(port,(struct Message *)Jhmsg);
  455.     (void)WaitPort(replymp);
  456.     (void)GetMsg(replymp);
  457.      strcpy(dest,Jhmsg->String);
  458.  
  459. }
  460. /*
  461. struct MsgPort *CreatePort(UBYTE *name,LONG pri)
  462. {
  463.   int sigBit;
  464.   struct MsgPort *mp;
  465.   
  466.   if((sigBit=AllocSignal(-1L))==-1)
  467.     return(NULL);
  468.   mp=(struct MsgPort *)
  469.      AllocMem((ULONG)sizeof(struct MsgPort),(ULONG)MEMF_CLEAR|MEMF_PUBLIC);
  470.   if(!mp)
  471.   {
  472.     FreeSignal(sigBit);
  473.     return(NULL);
  474.   }
  475.   mp->mp_Node.ln_Name=name;
  476.   mp->mp_Node.ln_Pri=pri;
  477.   mp->mp_Node.ln_Type=NT_MSGPORT;
  478.   mp->mp_Flags=PA_SIGNAL;
  479.   mp->mp_SigBit=sigBit;
  480.   mp->mp_SigTask=(struct Task *)FindTask(0L);
  481.   if(name)
  482.     AddPort(mp);
  483.   else
  484.     NewList(&(mp->mp_MsgList));
  485.   return(mp);
  486. }
  487. */
  488. int getsignal(void)
  489. {
  490.   Jhmsg->Command = JH_SIGBIT;
  491.     PutMsg(port,(struct Message *)Jhmsg);
  492.     (void)WaitPort(replymp);
  493.     (void)GetMsg(replymp);
  494.    return(Jhmsg->Data);
  495. }
  496. void FlagFile(char *string)
  497. {
  498.    strcpy(Jhmsg->String,string);
  499.     Jhmsg->Command = JH_FLAGFILE;
  500.     PutMsg(port,(struct Message *)Jhmsg);
  501.     (void)WaitPort(replymp);
  502.     (void)GetMsg(replymp);
  503. }
  504. VOID CloseOut(void)
  505. {
  506.   ShutDown();
  507.   end();
  508. }
  509. BOOL CheckToDisplay(char *s)
  510. {
  511. register int loop;
  512. char FileName[200];
  513. char temp[200];
  514. getuserstring(FileName,DT_SECSTATUS);
  515. loop=atoi(FileName);
  516. strcpy(FileName,s);
  517.     loop=(loop-(loop%5));
  518.     for(; loop>2; loop-=5)
  519.         {
  520.         sprintf(temp,"%s%d.txt",FileName,loop);
  521.           if(TLock(temp))
  522.           {
  523.             sprintf(temp,"%s%d",FileName,loop);
  524.             showgfile(temp); return(1);
  525.           }
  526.           sprintf(temp,"%s%d.txt.gr",FileName,loop);
  527.           if(TLock(temp))
  528.           {
  529.              sprintf(temp,"%s%d",FileName,loop);
  530.              showgfile(temp); return(1);
  531.           }
  532.           sprintf(temp,"%s%d.GR1",FileName,loop);
  533.           if(TLock(temp))
  534.           {
  535.              sprintf(temp,"%s%d",FileName,loop);
  536.              showgfile(temp); return(1);
  537.           }          
  538.     }
  539.      sprintf(temp,"%s.txt",FileName);
  540.      if(TLock(temp))
  541.      {
  542.        showgfile(FileName); return(1);
  543.      }
  544.      sprintf(temp,"%s.txt.gr",FileName);
  545.      if(TLock(temp))
  546.      {
  547.        showgfile(FileName); return(1);
  548.      }
  549.      sprintf(temp,"%s.GR1",FileName);
  550.      if(TLock(temp))
  551.      {
  552.        showgfile(FileName); return(1);
  553.      }
  554.      return(0);
  555. }
  556.  
  557. int TLock(char *str)
  558. {
  559.   long lock;
  560.   if(lock=Lock(str,ACCESS_READ))
  561.   {
  562.     UnLock(lock); return(1);
  563.   }
  564.   return(0);
  565. }
  566. APTR GetSemaphore(void)
  567. {
  568.    Jhmsg->Command=MULTICOM;
  569.    PutMsg(port,(struct Message *)Jhmsg);
  570.     (void)WaitPort(replymp);
  571.     (void)GetMsg(replymp);
  572.      return(msg->Semi);
  573. }
  574. int AcsStat(int bits,int opt)
  575. {
  576.    switch(opt)
  577.    {
  578.      case ADDBIT:
  579.           Jhmsg->Command=ADDBIT;
  580.           Jhmsg->Data=bits;
  581.           break;
  582.      case REMBIT:
  583.           Jhmsg->Command=REMBIT;
  584.           Jhmsg->Data=bits;
  585.           break;
  586.      case QUERYBIT:
  587.           Jhmsg->Command=QUERYBIT;
  588.           Jhmsg->Data=bits;
  589.           break;
  590.      default: return(0);
  591.    } 
  592.        PutMsg(port,(struct Message *)Jhmsg);
  593.     (void)WaitPort(replymp);
  594.     (void)GetMsg(replymp);
  595.      return(msg->Command);
  596. }
  597. STRPTR GetTheDate(long number)
  598. {
  599.   char Date[22];
  600.   getsystime(number,Date,NULL);
  601.   return(Date);
  602. }
  603. STRPTR GetTheTime(long number)
  604. {
  605.   char temp[30];
  606.   getsystime(number,NULL,temp);
  607.  return(temp);
  608. }
  609. ULONG UnixTimeOffset = 252482400;
  610.  
  611. /**********************************************************
  612.  *    ULONG getsystime(struct timeval *tv)
  613.  *
  614.  *      This function was rewritten using DateStamp() to
  615.  * eliminate the opening and closing of the timer.device
  616.  * that was occurring everytime this function was called.
  617.  * An attempt to save some processing time.   -WMP-
  618.  **********************************************************/
  619. void getsystime(long number,char *d,char *t)
  620. {
  621.   struct DateStamp ds;
  622.    struct DateTime dt;
  623.    if(number==0L)
  624.    {
  625.      DateStamp(&ds);
  626.      dt.dat_Stamp=ds;
  627.    }
  628.    else
  629.    {
  630.       number -= UnixTimeOffset;
  631.       dt.dat_Stamp.ds_Days=number/(60L*60L*24L);
  632.                            number -= dt.dat_Stamp.ds_Days*(60L*60L*24L);
  633.       dt.dat_Stamp.ds_Minute=number/60L; 
  634.       dt.dat_Stamp.ds_Tick=0L;
  635.    }
  636.      dt.dat_Format=FORMAT_USA;
  637.    dt.dat_StrDay=NULL;
  638.    dt.dat_StrDate=d;
  639.    dt.dat_StrTime=t;
  640.    dt.dat_Flags=DTB_SUBST;
  641.    DateToStr(&dt);
  642. }
  643.